package beans;

import entidades.Processo;
import entidades.Usuario;
import excessoes.DAOException;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import rn.AnexoProcessoRN;
import rn.ProcessoRN;
import util.ContextoUtil;
import util.FacesUtil;
import entidades.AnexoProcesso;

/**
 * teste oswaldo
 * @author Marcelo Neto
 */

@ManagedBean(name="anexoProcessoBean")
@ViewScoped
public class AnexoProcessoBean implements Serializable 
{
    private static final long serialVersionUID = 9121131171000982110L;
    private AnexoProcesso anexoProcesso = new AnexoProcesso();
    private ContextoBean contextoBean = ContextoUtil.getContextoBean();
    private List<AnexoProcesso> listarAnexo;
    private List<AnexoProcesso> listarAnexosPorProcesso;
    private List<AnexoProcesso> listarAnexosNoSetor;
    private List<AnexoProcesso> listarAnexosPorStatus;
    private Integer filtroSelecionado;
    private Integer processoSelecionado;
    private String numeroPag; //variável criada para exibir no HEADER da tabela de anexos
    private Boolean trataBotao = true;
    private int status; //Habilita ou desabilita os botões de incluir e excluir volume conforme status do processo
    
    public void prepararAdicionarAnexo(ActionEvent actionEvent) {
        this.anexoProcesso = new AnexoProcesso();
    }
    
    public String incluirAnexo() throws DAOException, Exception 
    {
        Usuario usuario = this.contextoBean.getUsuarioLogado();
        AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
        Integer qtdeAnexos = this.listarAnexosPorProcesso.size();
        
        ProcessoRN processoRN = new ProcessoRN();
        Processo processo = processoRN.carregarProcesso(this.processoSelecionado);
        this.anexoProcesso.setProcesso(processo);
              
        if(qtdeAnexos <= 0 || qtdeAnexos == null) 
        {
            this.anexoProcesso.setAnexo(1);
            anexoProcessoRN.incluirAnexo(this.anexoProcesso, usuario);
            this.setTrataBotao(true);
        }
        else {
            this.anexoProcesso.setAnexo(qtdeAnexos+1);
            anexoProcessoRN.incluirAnexo(this.anexoProcesso, usuario);
        }
        return null;
    }
        
    public String excluirAnexo() throws Exception
    {
        Usuario usuario = this.contextoBean.getUsuarioLogado();
        AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
        Integer qtdeAnexos = this.listarAnexosPorProcesso.size();
        if(qtdeAnexos == null || qtdeAnexos <= 0 ) {
            this.setTrataBotao(false);
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Não há anexos!", ""));
        }
        else {
            this.anexoProcesso = this.listarAnexosPorProcesso.remove(qtdeAnexos-1);
            anexoProcessoRN.excluirAnexo(this.anexoProcesso, usuario);
        }
        return null;
    }

    public List<AnexoProcesso> getListarAnexo() 
    {
        /*
        VolumeProcessoRN volumeProcessoRN = new VolumeProcessoRN();
        
        if((this.listarAnexo == null) && (this.dataIni == null || this.dataFim == null)) {
           this.setListar(processoRN.listar());
        }
        if((this.listar != null) && (this.dataIni != null || this.dataFim != null)) {
            this.setListar(processoRN.listarProcessoPorPeriodo(dataIni, dataFim));
        }
        if((this.listar != null) && (this.dataIni == null || this.dataFim == null)) {
           this.setListar(processoRN.listar());
        }
        * */
        if(this.listarAnexo == null)
        {
            AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
            this.setListarAnexo(anexoProcessoRN.listarAnexo());
        }
        return this.listarAnexo;
    }

    public void setListarAnexo(List<AnexoProcesso> listarAnexo) {
        this.listarAnexo = listarAnexo;
    }

    public AnexoProcesso getAnexoProcesso() {
        return anexoProcesso;
    }

    public void setAnexoProcesso(AnexoProcesso anexoProcesso) {
        this.anexoProcesso = anexoProcesso;
    }
    
    public void selecionaAnexoPorProcesso(ValueChangeEvent event) 
    {
        Object valor = event.getNewValue(); 
        AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
        this.processoSelecionado = (Integer)valor; 
        
        if(this.processoSelecionado != null) {
//            this.setListarVolumePorProcesso(volumeProcessoRN.listarAnexosPorProcesso(this.processoSelecionado));
        }
    }
    
    /*
    public VolumeProcess carregaSetorUsuario(ValueChangeEvent event) 
    {
        Integer setorUsuario = (Integer) event.getNewValue(); 
        SetorRN volumeProcessoRN = new SetorRN();
        return volumeProcessoRN.carregaSetorPorOm(this.processoSelecionado, setorUsuario);

    }
    */
        
    public List<AnexoProcesso> getListarAnexosPorProcesso() 
    {
        if(this.processoSelecionado != null)
        {
            AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
            this.setListarAnexosPorProcesso(anexoProcessoRN.listarAnexosPorProcesso(this.processoSelecionado));
        }
        return listarAnexosPorProcesso;
    }

    public void setListarAnexosPorProcesso(List<AnexoProcesso> listarAnexosPorProcesso) {
        this.listarAnexosPorProcesso = listarAnexosPorProcesso;
    }

    public Integer getProcessoSelecionado() {
        return processoSelecionado;
    }

    public void setProcessoSelecionado(Integer processoSelecionado) {
        this.processoSelecionado = processoSelecionado;
    }
    
    public String getNumeroPag() 
    {
        try
        {
            if(this.processoSelecionado != null)
            {
                ProcessoRN processoRN = new ProcessoRN();
                Processo processo = processoRN.carregarProcesso(this.processoSelecionado);
                String numPag = processo.getPag();
                this.setNumeroPag(numPag);
            }
            return numeroPag;
        } 
        catch (Exception ex) {
            Logger.getLogger(AnexoProcessoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return numeroPag;
    }

    public void setNumeroPag(String numeroPag) {
        this.numeroPag = numeroPag;
    }

    public Boolean getTrataBotao() {
        return trataBotao;
    }

    public void setTrataBotao(Boolean trataBotao) {
        this.trataBotao = trataBotao;
    }

    public List<AnexoProcesso> getListarAnexosNoSetor() 
    {
        Usuario usuario = contextoBean.getUsuarioLogado();
        Integer unidadeUsuario = usuario.getPessoa().getUnidade();
        Integer setorUsuario = usuario.getPessoa().getSetor();
        
        if(unidadeUsuario != null && setorUsuario != null)
        {
            AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
            this.setListarAnexosNoSetor(anexoProcessoRN.listarAnexosNoSetor(unidadeUsuario, setorUsuario));
        }
        return listarAnexosNoSetor;
    }

    public void setListarAnexosNoSetor(List<AnexoProcesso> listarAnexosNoSetor) {
        this.listarAnexosNoSetor = listarAnexosNoSetor;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public List<AnexoProcesso> getListarAnexosPorStatus() 
    {
        AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
        if (this.filtroSelecionado != null) {
            this.setListarAnexosPorStatus(anexoProcessoRN.listarAnexosPorStatus(this.filtroSelecionado));
        }
        return listarAnexosPorStatus;
    }

    public void setListarAnexosPorStatus(List<AnexoProcesso> listarAnexosPorStatus) {
        this.listarAnexosPorStatus = listarAnexosPorStatus;
    }

    public Integer getFiltroSelecionado() {
        return filtroSelecionado;
    }

    public void setFiltroSelecionado(Integer filtroSelecionado) {
        this.filtroSelecionado = filtroSelecionado;
    }
}